package com.warom.sdg.webview.jsinterface;

import android.content.Context;
import android.util.Log;
import android.webkit.JavascriptInterface;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.warom.sdg.callback.WebViewJsCallback;
import com.warom.sdg.dto.AlarmHandleRequestDto;
import com.warom.sdg.dto.AlarmQueryRequestDto;
import com.warom.sdg.dto.AlarmRecordDto;
import com.warom.sdg.dto.AlarmStatisticsDto;
import com.warom.sdg.dto.PageResponseDto;
import com.warom.sdg.model.ApiResponse;
import com.warom.sdg.service.AlarmAnalysisService;
import com.warom.sdg.util.UserPreferencesUtil;
import com.warom.sdg.webview.BaseWebViewJsInterface;
import com.warom.sdg.webview.WebViewWrapper;

import org.json.JSONException;
import org.json.JSONObject;

import java.lang.reflect.Type;

/**
 * 报警分析WebView JavaScript接口
 * 用于报警分析页面与Android原生代码的交互
 */
public class WebViewJsAlarmAnalysisInterface extends BaseWebViewJsInterface {
    private static final String TAG = "WebViewJsAlarmInterface";
    private final AlarmAnalysisService alarmAnalysisService;
    private final Gson gson;
    
    public WebViewJsAlarmAnalysisInterface(Context context, WebViewWrapper webViewWrapper) {
        super(context, webViewWrapper);
        this.alarmAnalysisService = new AlarmAnalysisService(context);
        this.gson = new Gson();
    }
    
    /**
     * 获取粮情报警数据
     * @param jsonParams JSON参数字符串
     * @return JSON格式的响应数据
     */
    @JavascriptInterface
    public String getGrainAlarms(String jsonParams) {
        Log.i(TAG, "getGrainAlarms: " + jsonParams);
        
        try {
            // 解析参数
            JSONObject params = new JSONObject(jsonParams);
            
            // 构建查询请求
            AlarmQueryRequestDto queryRequest = new AlarmQueryRequestDto();
            queryRequest.setAlarmType("GRAIN");
            
            // 设置参数类型
            String alarmType = params.optString("alarmType", "all");
            if ("temperature".equals(alarmType)) {
                queryRequest.setParamType("temperature");
            } else if ("humidity".equals(alarmType)) {
                queryRequest.setParamType("humidity");
            } else {
                queryRequest.setParamType("all");
            }
            
            // 设置报警级别
            String alarmLevel = params.optString("alarmLevel", "all");
            if ("high".equals(alarmLevel)) {
                queryRequest.setLevel("HIGH");
            } else if ("medium".equals(alarmLevel)) {
                queryRequest.setLevel("MEDIUM");
            } else if ("low".equals(alarmLevel)) {
                queryRequest.setLevel("LOW");
            } else {
                queryRequest.setLevel("all");
            }
            
            // 设置时间范围
            queryRequest.setTimeRange(params.optString("timeRange", "week"));
            
            // 设置分页参数
            queryRequest.setPage(params.optInt("page", 1));
            queryRequest.setPageSize(params.optInt("pageSize", 10));
            
            // 如果是自定义时间范围，设置开始和结束时间
            if ("custom".equals(queryRequest.getTimeRange()) && params.has("startTime") && params.has("endTime")) {
                queryRequest.setStartTime(params.getLong("startTime"));
                queryRequest.setEndTime(params.getLong("endTime"));
            }
            
            // 查询报警记录
            ApiResponse<PageResponseDto<AlarmRecordDto>> response = alarmAnalysisService.queryAlarms(queryRequest);
            
            // 返回JSON响应
            return gson.toJson(response);
            
        } catch (Exception e) {
            Log.e(TAG, "获取粮情报警数据失败: " + e.getMessage());
            return gson.toJson(new ApiResponse<>(false, "获取粮情报警数据失败: " + e.getMessage(), null));
        }
    }
    
    /**
     * 获取气体报警数据
     * @param jsonParams JSON参数字符串
     * @return JSON格式的响应数据
     */
    @JavascriptInterface
    public String getGasAlarms(String jsonParams) {
        Log.i(TAG, "getGasAlarms: " + jsonParams);
        
        try {
            // 解析参数
            JSONObject params = new JSONObject(jsonParams);
            
            // 构建查询请求
            AlarmQueryRequestDto queryRequest = new AlarmQueryRequestDto();
            queryRequest.setAlarmType("GAS");
            
            // 设置参数类型
            String gasType = params.optString("gasType", "all");
            if ("oxygen".equals(gasType)) {
                queryRequest.setParamType("oxygen");
            } else if ("co2".equals(gasType)) {
                queryRequest.setParamType("co2");
            } else if ("ph3".equals(gasType)) {
                queryRequest.setParamType("ph3");
            } else {
                queryRequest.setParamType("all");
            }
            
            // 设置报警级别
            String alarmLevel = params.optString("alarmLevel", "all");
            if ("high".equals(alarmLevel)) {
                queryRequest.setLevel("HIGH");
            } else if ("medium".equals(alarmLevel)) {
                queryRequest.setLevel("MEDIUM");
            } else if ("low".equals(alarmLevel)) {
                queryRequest.setLevel("LOW");
            } else {
                queryRequest.setLevel("all");
            }
            
            // 设置时间范围
            queryRequest.setTimeRange(params.optString("timeRange", "week"));
            
            // 设置分页参数
            queryRequest.setPage(params.optInt("page", 1));
            queryRequest.setPageSize(params.optInt("pageSize", 10));
            
            // 如果是自定义时间范围，设置开始和结束时间
            if ("custom".equals(queryRequest.getTimeRange()) && params.has("startTime") && params.has("endTime")) {
                queryRequest.setStartTime(params.getLong("startTime"));
                queryRequest.setEndTime(params.getLong("endTime"));
            }
            
            // 查询报警记录
            ApiResponse<PageResponseDto<AlarmRecordDto>> response = alarmAnalysisService.queryAlarms(queryRequest);
            
            // 返回JSON响应
            return gson.toJson(response);
            
        } catch (Exception e) {
            Log.e(TAG, "获取气体报警数据失败: " + e.getMessage());
            return gson.toJson(new ApiResponse<>(false, "获取气体报警数据失败: " + e.getMessage(), null));
        }
    }
    
    /**
     * 处理报警
     * @param jsonParams JSON参数字符串
     * @return JSON格式的响应数据
     */
    @JavascriptInterface
    public String handleAlarm(String jsonParams) {
        Log.i(TAG, "handleAlarm: " + jsonParams);
        
        try {
            // 解析参数
            JSONObject params = new JSONObject(jsonParams);
            
            // 构建处理请求
            AlarmHandleRequestDto handleRequest = new AlarmHandleRequestDto();
            handleRequest.setId(params.getLong("id"));
            handleRequest.setAction("HANDLE");
            handleRequest.setHandleDescription(params.optString("description", "已处理"));
            
            // 获取当前用户
            String currentUser = getCurrentUser();
            if (currentUser == null || currentUser.isEmpty()) {
                currentUser = "system";
            }
            handleRequest.setHandleUser(currentUser);
            
            // 处理报警
            ApiResponse<Boolean> response = alarmAnalysisService.handleAlarm(handleRequest);
            
            // 返回JSON响应
            return gson.toJson(response);
            
        } catch (Exception e) {
            Log.e(TAG, "处理报警失败: " + e.getMessage());
            return gson.toJson(new ApiResponse<>(false, "处理报警失败: " + e.getMessage(), false));
        }
    }
    
    /**
     * 忽略报警
     * @param jsonParams JSON参数字符串
     * @return JSON格式的响应数据
     */
    @JavascriptInterface
    public String ignoreAlarm(String jsonParams) {
        Log.i(TAG, "ignoreAlarm: " + jsonParams);
        
        try {
            // 解析参数
            JSONObject params = new JSONObject(jsonParams);
            
            // 构建处理请求
            AlarmHandleRequestDto handleRequest = new AlarmHandleRequestDto();
            handleRequest.setId(params.getLong("id"));
            handleRequest.setAction("IGNORE");
            handleRequest.setHandleDescription(params.optString("description", "已忽略"));
            
            // 获取当前用户
            String currentUser = getCurrentUser();
            if (currentUser == null || currentUser.isEmpty()) {
                currentUser = "system";
            }
            handleRequest.setHandleUser(currentUser);
            
            // 处理报警
            ApiResponse<Boolean> response = alarmAnalysisService.handleAlarm(handleRequest);
            
            // 返回JSON响应
            return gson.toJson(response);
            
        } catch (Exception e) {
            Log.e(TAG, "忽略报警失败: " + e.getMessage());
            return gson.toJson(new ApiResponse<>(false, "忽略报警失败: " + e.getMessage(), false));
        }
    }
    
    /**
     * 获取报警详情
     * @param jsonParams JSON参数字符串
     * @return JSON格式的响应数据
     */
    @JavascriptInterface
    public String getAlarmDetail(String jsonParams) {
        Log.i(TAG, "getAlarmDetail: " + jsonParams);
        
        try {
            // 解析参数
            JSONObject params = new JSONObject(jsonParams);
            long id = params.getLong("id");
            
            // 获取报警详情
            ApiResponse<AlarmRecordDto> response = alarmAnalysisService.getAlarmDetail(id);
            
            // 返回JSON响应
            return gson.toJson(response);
            
        } catch (Exception e) {
            Log.e(TAG, "获取报警详情失败: " + e.getMessage());
            return gson.toJson(new ApiResponse<>(false, "获取报警详情失败: " + e.getMessage(), null));
        }
    }
    
    /**
     * 获取报警统计数据
     * @param jsonParams JSON参数字符串
     * @return JSON格式的响应数据
     */
    @JavascriptInterface
    public String getAlarmStatistics(String jsonParams) {
        Log.i(TAG, "getAlarmStatistics: " + jsonParams);
        
        try {
            // 解析参数
            JSONObject params = new JSONObject(jsonParams);
            String alarmType = params.optString("alarmType", "all");
            String timeRange = params.optString("timeRange", "week");
            
            long startTime = 0;
            long endTime = 0;
            
            // 如果是自定义时间范围，获取开始和结束时间
            if ("custom".equals(timeRange) && params.has("startTime") && params.has("endTime")) {
                startTime = params.getLong("startTime");
                endTime = params.getLong("endTime");
            }
            
            // 获取统计数据
            ApiResponse<AlarmStatisticsDto> response = alarmAnalysisService.getAlarmStatistics(
                    alarmType, timeRange, startTime, endTime);
            
            // 返回JSON响应
            return gson.toJson(response);
            
        } catch (Exception e) {
            Log.e(TAG, "获取报警统计数据失败: " + e.getMessage());
            return gson.toJson(new ApiResponse<>(false, "获取报警统计数据失败: " + e.getMessage(), null));
        }
    }
    
    /**
     * 创建报警记录（用于测试）
     * @param jsonParams JSON参数字符串
     * @return JSON格式的响应数据
     */
    @JavascriptInterface
    public String createAlarmRecord(String jsonParams) {
        Log.i(TAG, "createAlarmRecord: " + jsonParams);
        
        try {
            // 解析参数
            Type type = new TypeToken<AlarmRecordDto>(){}.getType();
            AlarmRecordDto dto = gson.fromJson(jsonParams, type);
            
            // 创建报警记录
            ApiResponse<Long> response = alarmAnalysisService.createAlarmRecord(dto);
            
            // 返回JSON响应
            return gson.toJson(response);
            
        } catch (Exception e) {
            Log.e(TAG, "创建报警记录失败: " + e.getMessage());
            return gson.toJson(new ApiResponse<>(false, "创建报警记录失败: " + e.getMessage(), -1L));
        }
    }
    
    /**
     * 获取当前用户名
     * @return 当前用户名
     */
    private String getCurrentUser() {
        try {
            return UserPreferencesUtil.getCurrentUsername(context);
        } catch (Exception e) {
            Log.e(TAG, "获取当前用户失败: " + e.getMessage());
            return "";
        }
    }
} 